/**
 * AddProductoAction.java
 * Action que da de alta un nuevo Producto.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 */
package ocio.actions;  

import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.struts2.ServletActionContext;
import ocio.utils.RellenoCombos;
import ocio.beans.Admin;
import ocio.beans.Producto;
import ocio.beans.Proveedor;
import ocio.beans.Provincia;
import ocio.beans.Reserva;
import ocio.beans.Subscripcion;
import ocio.beans.Subtipo;
import ocio.beans.Usuario;
import ocio.services.ProductoService;
import ocio.services.ProveedorService;
import ocio.services.AdminService;
import ocio.services.ServiceLocator;
import ocio.services.ProvinciaService;
import ocio.services.SubtipoService;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Clase destinataria de petición de alta de un nuevo producto.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Oferta
 */
public class AddProductoAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	private String direccion;
	private String descripcion;
	private String telefono;
	private String nombre;
	private String municipio;
	private String foto;
	private int idUsuario;
	private int idProvincia;
	private int idSubtipo;
	private Usuario usuario;
	private Provincia provincia;
	private Subtipo subtipo;
	private Proveedor proveedor;
	private Admin admin;
	private int tipo;
	private Set<Producto> listaProductos = new HashSet<Producto>();
	private Set<Subscripcion> listaSubscripciones = new HashSet<Subscripcion>();
	private Set<Reserva> listaReservas = new HashSet<Reserva>();
	private int rol;
	private List<Provincia> listaProvincias = new ArrayList<Provincia>();
	private List<Subtipo> listaSubtiposFiltrada = new ArrayList<Subtipo>();
	private String mensaje;
	private File archivo;
	private String archivoFileName;
    private String archivoContentType;

    /**
	 * Método execute() de la clase ActionSupport de Struts 2. 
	 * Comprueba que no hay otro producto con ese nombre y si se ha incorporado un fichero con 
	 * la imagen del producto. Luego solicita las servicios para dar de alta el nuevo producto
	 * @return un string que indica la respuesta de la acción ejecutada sobre la petición del usuario
	 */
	public String execute(){	
		
		RellenoCombos rC = new RellenoCombos();
		this.setListaProvincias(rC.getListaProvincias(true));
		
		ServiceLocator serviceLocator = ServiceLocator.getServiceLocator();
		ProvinciaService provinciaService = (ProvinciaService)serviceLocator.getService("Provincia");
		provincia=(Provincia)provinciaService.searchById(idProvincia);
		
		SubtipoService subtipoService = (SubtipoService)serviceLocator.getService("Subtipo");
		setSubtipo((Subtipo)subtipoService.searchById(idSubtipo));
			
		ProductoService ProductoService = (ProductoService)serviceLocator.getService("Producto");

		Map<String,Object> sesion = ActionContext.getContext().getSession();
		idUsuario = (Integer)sesion.get("IDPROVEEDOR");
		
		// Gestión de la subida de archivografias
		if (archivo!=null){
	    	//Validamos tipo de fichero 
	    	if (archivoContentType.startsWith("image")){
	    		String path = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/");
	        	String path1 = path + "img\\productos\\";
		    	String extension = archivoContentType.substring(6); // image/ext
		    	setFoto(idUsuario + "." + extension);
		    	File nuevoArchivo = new File(path1,foto);
			    archivo.renameTo(nuevoArchivo);
	    	} else {
	    		setMensaje("Formato de imágen no válido del fichero seleccionado");
	    		return "fail";
	    	}		
	    } else {
	    	setFoto("NoDisponible.jpg");
	    }
	    
	    
		AdminService AdminService = (AdminService)serviceLocator.getService("Admin");
		ProveedorService ProveedorService = (ProveedorService)serviceLocator.getService("Proveedor");

		if (sesion.get("ROL")=="Admin") {  
			//Es el admin el que está dando de alta un producto
			admin=(Admin) AdminService.searchById(idUsuario);
			usuario=(Usuario)admin;
			setRol(usuario.getRol());
		} else {
			//Es un proveedor el que está dando de alta el producto o el admin en nombre de un proveedor
			proveedor=(Proveedor) ProveedorService.searchById(idUsuario);
			tipo = proveedor.getTipo();
			usuario=(Usuario)proveedor;
			setRol(usuario.getRol());
		}
				

		boolean ok=false;
		ok=ProductoService.add(this);
		if (ok) {
			if (sesion.get("ROL")=="Admin") {
				admin=(Admin) AdminService.searchById(idUsuario);
				this.listaProductos = admin.getProductos();
				this.listaReservas=admin.getReservas();
				this.listaSubscripciones=admin.getSubscripciones();
			} else {
				proveedor=(Proveedor) ProveedorService.searchById(idUsuario);
				this.listaProductos = proveedor.getProductos();
			}
			return "success";	
		} else {
			setMensaje("Ya existe un producto con ese nombre.");
			return "fail";
		}	
		
	}

    /**
	 * Método validate() de la clase ActionSupport de Struts 2. 
	 * Valida que se han rellendado los campos obligatorios.
	 */
	public void validate(){
			
		if(nombre.length()==0){
			this.addFieldError("nombre","El nombre del producto es necesario.");
		}
		
		if(descripcion.length()==0){
			this.addFieldError("descripcion","Se requiere una descripción para el producto.");
		}
		if(direccion.length()==0){
			this.addFieldError("direccion","Es necesario introducir la dirección donde se ofrece el producto.");
		}
		if(municipio.length()==0){
			this.addFieldError("municipio","Es necesario introducir el municipio donde se ofrece el producto.");
		}
		if(telefono.length()==0){
			this.addFieldError("telefono","Se requiere un telefono de contacto.");
		}
		
		ServiceLocator serviceLocator = ServiceLocator.getServiceLocator();
		SubtipoService subtipoService = (SubtipoService)serviceLocator.getService("Subtipo");
		setSubtipo((Subtipo)subtipoService.searchById(idSubtipo));
		Map<String,Object> sesion = ActionContext.getContext().getSession();
		if ((sesion.get("ROL")=="Admin") && (this.subtipo.getTipo()!=this.tipo)){
			this.addFieldError("idSubtipo","El subtipo elegido no pertenece al tipo seleccionado");
			listaSubtiposFiltrada= subtipoService.ListAllSubtipos();
		}
		
		
		//Datos de la página a la que se devuelve el control
		ProvinciaService pS = (ProvinciaService)serviceLocator.getService("Provincia");
		SubtipoService sS=(SubtipoService)serviceLocator.getService("Subtipo");
		
		listaProvincias= pS.ListAllProvincias();
		if (sesion.get("ROL")=="Admin"){
			listaSubtiposFiltrada= sS.ListAllSubtipos();
		} else {  //Caso proveedor
			Subtipo subtipo = new Subtipo();
			subtipo.setTipo((Integer)sesion.get("TIPOPROVEEDOR"));
			Iterator<Object> it3 = sS.searchByFields(subtipo).iterator();
			 while(it3.hasNext()) {
		         subtipo = (Subtipo) it3.next();
		         listaSubtiposFiltrada.add(subtipo);
			}
		}

		mensaje="Error en la introduccion de los datos";
		
	}
	
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		System.out.println("* Nombre..."+nombre);
		this.nombre = nombre;
	}
	
	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public Set<Producto> getListaProductos() {
		return listaProductos;
	}

	public void setListaProductos(Set<Producto> listaProductos) {
		this.listaProductos = listaProductos;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public int getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(int idUsuario) {
		this.idUsuario = idUsuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getMunicipio() {
		return municipio;
	}

	public void setMunicipio(String municipio) {
		this.municipio = municipio;
	}

	public int getTipo() {
		return tipo;
	}

	public void setTipo(int tipo) {
		this.tipo = tipo;
	}

	public int getIdProvincia() {
		return idProvincia;
	}

	public void setIdProvincia(int idProvincia) {
		this.idProvincia = idProvincia;
	}
	
	public int getIdSubtipo() {
		return idSubtipo;
	}

	public void setIdSubtipo(int idSubtipo) {
		this.idSubtipo = idSubtipo;
	}

	public Provincia getProvincia() {
		return provincia;
	}

	public void setProvincia(Provincia provincia) {
		this.provincia = provincia;
	}

	public Subtipo getSubtipo() {
		return subtipo;
	}

	public void setSubtipo(Subtipo subtipo) {
		this.subtipo = subtipo;
	}

	public Admin getAdmin() {
		return admin;
	}

	public void setAdmin(Admin admin) {
		this.admin = admin;
	}
	public Proveedor getProveedor() {
		return proveedor;
	}

	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}

	public int getRol() {
		return rol;
	}

	public void setRol(int rol) {
		this.rol = rol;
	}

	public List<Provincia> getListaProvincias() {
		return listaProvincias;
	}

	public void setListaProvincias(List<Provincia> listaProvincias) {
		this.listaProvincias = listaProvincias;
	}

	public String getMensaje() {
		return mensaje;
	}

	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}

	public Set<Subscripcion> getListaSubscripciones() {
		return listaSubscripciones;
	}

	public void setListaSubscripciones(Set<Subscripcion> listaSubscripciones) {
		this.listaSubscripciones = listaSubscripciones;
	}

	public Set<Reserva> getListaReservas() {
		return listaReservas;
	}

	public void setListaReservas(Set<Reserva> listaReservas) {
		this.listaReservas = listaReservas;
	}

	public File getArchivo() {
		return archivo;
	}

	public void setArchivo(File archivo) {
		this.archivo = archivo;
	}

	public String getArchivoFileName() {
		return archivoFileName;
	}

	public void setArchivoFileName(String archivoFileName) {
		this.archivoFileName = archivoFileName;
	}

	public String getArchivoContentType() {
		return archivoContentType;
	}

	public void setArchivoContentType(String archivoContentType) {
		this.archivoContentType = archivoContentType;
	}

	public String getFoto() {
		return foto;
	}

	public void setFoto(String foto) {
		this.foto = foto;
	}

	public List<Subtipo> getListaSubtiposFiltrada() {
		return listaSubtiposFiltrada;
	}

	public void setListaSubtiposFiltrada(List<Subtipo> listaSubtiposFiltrada) {
		this.listaSubtiposFiltrada = listaSubtiposFiltrada;
	}
}
